home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 June
/
EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso
/
earcd
/
comm1
/
intsdkss.lha
/
include
/
sys
/
malloc.h
< prev
next >
Wrap
C/C++ Source or Header
|
1996-04-09
|
8KB
|
238 lines
/*
* @(#)malloc.h: $Revision: 1.7.61.9 $ $Date: 92/04/19 21:33:13 $
* $Locker: $
*/
/*
* Copyright (c) 1987 Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by the University of California, Berkeley. The name of the
* University may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
* @(#)malloc.h 7.7 (Berkeley) 6/27/88
*/
#ifndef _SYS_MALLOC_INCLUDED /* allows multiple inclusion */
#define _SYS_MALLOC_INCLUDED
#define MAXALLOCSAVE (NBPG) /* Stop using powers-of-two at a page */
#define MAXBUCKETSAVE (PGSHIFT) /* Stop using powers-of-two at a page */
#define MINBUCKET (5) /* Minimum allocation size--32 bytes */
#define MAXBUCKET (MINBUCKET+15)/* Max allocation size */
/*
* flags to malloc
*/
#define M_WAITOK 0x0000
#define M_NOWAIT 0x0001
#define M_ALIGN 0x0002
#define M_EXECUTE 0x0004
/*
* Types of memory to be allocated
*/
#define M_FREE 0 /* should be on free list */
#define M_MBUF 1 /* network memory buffer */
#define M_DYNAMIC 2 /* dynamic (data) allocation */
#define M_HEADER 3 /* packet header */
#define M_SOCKET 4 /* socket structure */
#define M_PCB 5 /* protocol control block */
#define M_RTABLE 6 /* routing tables */
#define M_HTABLE 7 /* IMP host tables */
#define M_ATABLE 8 /* address resolution tables */
#define M_SONAME 9 /* socket name */
#define M_SOOPTS 10 /* socket options */
#define M_FTABLE 11 /* fragment reassembly header */
#define M_RIGHTS 12 /* access rights */
#define M_IFADDR 13 /* interface address */
#define M_NTIMO 14 /* network timeouts */
#define M_DEVBUF 15 /* device driver memory */
#define M_ZOMBIE 16 /* zombie proc status */
#define M_NAMEI 17 /* namei path name buffer */
#define M_GPROF 18 /* kernel profiling buffer */
#define M_IOCTLOPS 19 /* ioctl data buffer */
#define M_SUPERBLK 20 /* super block data */
#define M_CRED 21 /* credentials */
#define M_TEMP 22 /* misc temporary data buffers */
#define M_VAS 23 /* VAS structure */
#define M_PREG 24 /* Pregion structure */
#define M_REG 25 /* Region structure */
#define M_IOSYS 26 /* I/O system structure */
#define M_NIPCCB 27 /* Netipc control block */
#define M_NIPCSR 28 /* Netipc socket registry name record */
#define M_NIPCPR 29 /* Netipc path report */
#define M_DQUOTA 30 /* Disk Quotas Cache entries */
#define M_DMA 31 /* Snakes I/O dma services */
#define M_GRAF 32 /* Non-ITE graphics */
#define M_ITE 33 /* ITE (Internal Terminal Emulator) */
#define M_ATL 34 /* S300 attach list entries */
#define M_LOCKLIST 35 /* Locklist entry */
#define M_DBC 36 /* Related to dynamic buffer cache */
#define M_LOSTPAGE 37 /* VM copy avoidance lost page list entries */
#define M_COWARGS 38 /* VM copy-on-write reference descriptions */
#define M_LAST 39
/*
* If adding new types and changing M_LAST, remember to modify
* sys/vm_misc.c and analyze/standard/analyze.c, as well.
*/
#define btokup(va) ((struct kmemusage *)PAGE_INFO((caddr_t)va))
struct kmemstats {
int ks_flags; /* Flags */
int (*ks_check)();
int ks_sleep; /* Some one is waiting for this bucket */
long ks_reslimit; /* Total reserved bytes allowed */
long ks_resinuse; /* Total reserved bytes in use */
};
#define KS_RESERVED 0x01
/*
* Array of descriptors that describe the contents of each page
*/
struct kmemusage {
u_short ku_indx; /* bucket index */
u_short ku_pagecnt; /* for large allocations, */
/* pages allocated, else 0 */
};
/*
* Set high order bit in a short.
*/
#define RESERVED_POOL (1 << 15)
#define MAXPGCNT (~RESERVED_POOL)
/*
* Set of buckets for each size of memory block that is retained
*/
struct kmembuckets {
caddr_t kb_next; /* list of free blocks */
long kb_calls; /* total calls to allocate this size */
long kb_total; /* total number of pages allocated to a */
/* bucket (even if some elements are free) */
long kb_totalfree; /* # of free elements in this bucket */
#ifdef LATER
long kb_elmpercl; /* # of elements in this sized allocation */
long kb_highwat; /* high water mark */
long kb_couldfree; /* over high water mark and could free */
#endif /* LATER */
};
#ifdef _KERNEL
caddr_t kmalloc();
caddr_t kmem_alloc();
#define MINALLOCSIZE (1 << MINBUCKET)
#define BUCKETINDX(size) \
((size) <= (MINALLOCSIZE * 128) \
? (size) <= (MINALLOCSIZE * 8) \
? (size) <= (MINALLOCSIZE * 2) \
? (size) <= (MINALLOCSIZE * 1) \
? (MINBUCKET + 0) \
: (MINBUCKET + 1) \
: (size) <= (MINALLOCSIZE * 4) \
? (MINBUCKET + 2) \
: (MINBUCKET + 3) \
: (size) <= (MINALLOCSIZE* 32) \
? (size) <= (MINALLOCSIZE * 16) \
? (MINBUCKET + 4) \
: (MINBUCKET + 5) \
: (size) <= (MINALLOCSIZE * 64) \
? (MINBUCKET + 6) \
: (MINBUCKET + 7) \
: (size) <= (MINALLOCSIZE * 2048) \
? (size) <= (MINALLOCSIZE * 512) \
? (size) <= (MINALLOCSIZE * 256) \
? (MINBUCKET + 8) \
: (MINBUCKET + 9) \
: (size) <= (MINALLOCSIZE * 1024) \
? (MINBUCKET + 10) \
: (MINBUCKET + 11) \
: (size) <= (MINALLOCSIZE * 8192) \
? (size) <= (MINALLOCSIZE * 4096) \
? (MINBUCKET + 12) \
: (MINBUCKET + 13) \
: (size) <= (MINALLOCSIZE * 16384) \
? (MINBUCKET + 14) \
: (MINBUCKET + 15))
/*
* Macro versions for the usual cases of kmalloc/kfree
* Be sure that modifications are made to both the
* OSDEBUG and non-OSDEBUG versions.
*/
#define MALLOC(space, cast, size, type, flags) { \
struct kmembuckets *kbp = &bucket[BUCKETINDX(size)]; \
register int context; \
SPINLOCK_USAV(kmemlock, context); \
if ((size > MAXALLOCSAVE) || (kbp->kb_next == NULL)) { \
SPINUNLOCK_USAV(kmemlock, context); \
(space) = (cast)kmalloc((u_long)(size), type, flags); \
} else { \
(space) = (cast)kbp->kb_next; \
kbp->kb_next = *(caddr_t *)(space); \
SPINUNLOCK_USAV(kmemlock, context); \
} \
}
/* Use this macro when "size" is compile time known else use vapor_malloc() */
#define VAPOR_MALLOC(space, cast, size, type, flags) \
{ \
struct Vm { \
struct Vm *v_link; }; \
MALLOC((space), cast, ((size)+sizeof(struct Vm)), (type), (flags)); \
if (space) { \
((struct Vm *)(space))->v_link = (struct Vm *)u.u_vapor_mlist; \
u.u_vapor_mlist = (caddr_t)(space); \
(struct Vm *)(space) += 1; \
} \
}
extern void kfree();
#define FREE(x, type) { \
struct kmemusage *kup = btokup((caddr_t)x); \
if (kup->ku_indx > MAXBUCKETSAVE) { \
kfree((caddr_t)(x), type); \
} else { \
register int context; \
struct kmembuckets *kbp = &bucket[kup->ku_indx]; \
SPINLOCK_USAV(kmemlock, context); \
*(caddr_t *)(x) = kbp->kb_next; \
kbp->kb_next = (caddr_t)(x); \
SPINUNLOCK_USAV(kmemlock, context); \
} \
}
extern struct kmembuckets bucket[];
extern struct kmembuckets reserved_bucket[];
extern struct kmemstats kmemstats[];
extern vm_lock_t kmemlock;
/*
* Defines for calling kalloc (low level memory allocator).
*/
#define KALLOC_NOWAIT 0x01
#define KALLOC_NOZERO 0x02
#define KALLOC_NORESV 0x04
extern caddr_t kalloc();
#endif /* _KERNEL */
#endif /* _SYS_MALLOC_INCLUDED */